package pojo.utils;

import io.jsonwebtoken.*;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.nio.charset.StandardCharsets;
import java.util.Date;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * JWT 工具类，用于生成、解析和验证 Token
 */
@Component
public class JwtUtils {

    private static final Logger logger = LoggerFactory.getLogger(JwtUtils.class);

    // 从 application.yml 中注入密钥和过期时间
    @Value("${jwt.secret}")
    private String secret;

    @Value("${jwt.expiration}")
    private long expiration; // 单位：毫秒

    /**
     * 生成 JWT Token
     *
     * @param username 用户名
     * @return token 字符串
     */
    public String generateToken(String username) {
        return Jwts.builder()
                .setSubject(username)
                .setExpiration(new Date(System.currentTimeMillis() + expiration))
                .signWith(SignatureAlgorithm.HS512, secret.getBytes(StandardCharsets.UTF_8))
                .compact();
    }

    /**
     * 验证 Token 是否有效
     *
     * @param token token 字符串
     * @return true if valid
     */
    public boolean validateToken(String token) {
        try {
            Jwts.parser()
                .setSigningKey(secret.getBytes(StandardCharsets.UTF_8))
                .parseClaimsJws(token);
            return true;
        } catch (JwtException | IllegalArgumentException e) {
            logger.error("JWT验证失败: {}", e.getMessage());
            return false;
        }
    }

    /**
     * 从请求头中提取 Bearer Token
     *
     * @param request 请求对象
     * @return token 字符串 或 null
     */
    public String resolveToken(HttpServletRequest request) {
        String bearerToken = request.getHeader("Authorization");
        if (bearerToken != null && bearerToken.startsWith("Bearer ")) {
            return bearerToken.substring(7);
        }
        return null;
    }

    // 在 JwtUtils.java 中添加验证
    public String parseUsername(String token) {
        try {
            return Jwts.parser()
                    .setSigningKey(secret.getBytes(StandardCharsets.UTF_8))
                    .parseClaimsJws(token)
                    .getBody()
                    .getSubject();
        } catch (JwtException e) {
            logger.error("解析用户名失败: {}", e.getMessage());
            throw e;
        }
    }

    // 安全打印Token（脱敏处理）
    private String cleanTokenForLog(String token) {
        if(token == null) return "null";
        return token.substring(0, Math.min(10, token.length())) + "...";
    }
}